| Field Name | Type (Format) | Description |
|---|---|---|
| id | integer | ID for data entries |
| technology | string | Generation technology defined by fuel and conversion technology |
| source | string | Source of data entry |
| source_type | string | Type of data source |
| year | integer (YYYY) | Year of data entry |
| country | string | Country ISO code |
| capacity_definition | string | Capacity definition used in the relevant source (net, gross, or unknown) |
| capacity | float | Installed capacity in MW (MegaWatt) |
| energy_source_level 0 | boolean | Energy source level 0 (total aggregated capacity) |
| energy_source_level_1 | boolean | Energy source level 1 (aggregation or classification by type of fuel) |
| energy_source_level_2 | boolean | Energy source level 2 (aggregation or classification by fuel) |
| energy_source_level_3 | boolean | Energy source level 3 (aggregation or classification by fuel refined for bioenergy) |
| technology_level | boolean | Technology (aggregation or classification by fuel and technology) |
| Category/Technology | Note |
|---|---|
| Differently categorized … | These categories comprise either capacities which cannot be assigned to specific categories at the same level, or capacities with unspecified fuel or technology. |
| Reservoir including pumped storage | Aggregated capacity of reservoirs and pumped storage, or combinations of both. Relevant for AT. |
| Pumped storage with natural inflow | Pumped storage with natural inflow, or reservoirs with pumping capacity. |
import numpy as np
import pandas as pd
data = pd.read_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\national_generation_capacity_stacked.csv')
#Vengono rimosse le colonne non utilizzabili per il Data Mining.
data_e = data.drop(['weblink', 'comment', 'type'], axis = 1)
data_e
#Conversione da ISO 3166-1 alpha-2 codes al country_name utilizzando una funzione esterna contenuta nel file 'iso_country_codes.py'.
from iso_country_codes import CC
data_e['country_name'] = data_e['country'].replace(CC)
#Viene eliminata la colonna con i codici ISO 3166-1 alpha-2, ID e vengono riordinate le altre
data_energy = data_e[['technology','source','source_type','country_name','capacity_definition','capacity','energy_source_level_0',
'energy_source_level_1','energy_source_level_2','energy_source_level_3','technology_level']]
data_energy
#Si è scelto di eliminare i codici ISO perchè potrebbero risultare di non immediata lettura, inoltre si è deciso di non riportare l'ID.
#Perchè? - Perchè l'ID risulta essere il numero identificativo della riga all'interno del DataFrame relativo.
#Cosa vuol dire? - data_energy è dato dall'insieme di più DataFrame e quindi l'ID che identifica un array non è assoluto, ma relativo a un DataFrame contenuto in data_energy.
#Si esegue un controllo per eventuali valori mancanti.
data_energy.isnull().sum()
data_energy = data_energy.fillna(0)
#Si riesegue un controllo e si nota come effettivamente tutti i 'NaN' siano stati sostituiti dal valore 0.
data_energy.isnull().sum()
#Se avessimo voluto effetturare medie, avremmo potuto eliminare direttamente l'intera stringa contenente il valore mancante.
#Salvataggio del DataFrame modificato in formato .csv
data_energy.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_energy.csv')
#Import delle librerie matplotlib.pyplot, seaborn, seaborn.set() per grafici futuri
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set_theme()
#Conteggio ripetizioni di ogni singola technology
data_1 = data_energy.groupby(['technology']).count()
data_1 = data_1[['source']]
data_1 = data_1.rename(columns = {'source': 'count'})
#Viene rimosso anche Total perchè non è una technology
data_1 = data_1.drop(['Total'])
data_1
#Conteggio delle technology totali utilizzate in Europa
conteggio = data_1.count()
conteggio
#Per poter far un buon grafico è necessario filtrare tutti quei valori che non si vedrebbero confrontati a valori troppo alti (estrazione > 1500)
data_1 = data_1.loc[(data_1['count'] > 1500)]
data_1
#Export del DataFrame data_1
data_1.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_1.csv')
#Import DataFrame data_1
data_1_2 = pd.read_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_1.csv')
data_1_2
#Bar plot che mostra i count di ogni technology
height = 15
width= 8
fig, ax = plt.subplots(figsize=(height,width))
sns.set_style(style = "white")
sns.set_color_codes("pastel")
ax = sns.barplot(x="count", y="technology", data= data_1_2, color="g", ax = ax)
ax.set(xlim =(1500, 1900))
data_energy
#DataFrame ridotto dal quale si estraggono solo le righe con (data_2.energy_source_level_1 == True) | (data_2.energy_source_level_2 == True) | (data_2.energy_source_level_3 == True)
data_2 = data_energy[['technology', 'capacity', 'energy_source_level_1', 'energy_source_level_2','energy_source_level_3']]
data_2 = data_2[(data_2.energy_source_level_1 == True) | (data_2.energy_source_level_2 == True) | (data_2.energy_source_level_3 == True)]
data_2
#Si crea un DataFrame con capacity totale (che tornerà utile dopo) e i 3 energy_source_level che ci permetteranno di fare un'osservazione
#Con la funzione .sum() si esegue una sommatoria di tutti i valori raggruppati per technology (.groupby())
data_2_energy_source = data_2.groupby(['technology']).sum()
data_2_energy_source
#Estrazione dal DataFrame data_2_energy_source la variabile 'capacity' che poi tornerà utile per il grafico.
data_2_1 = data_2_energy_source[['capacity']]
#Export del DataFrame data_2
data_2_1.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_2_1.csv')
#Import DataFrame data_2
data_2_2 = pd.read_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_2_1.csv')
data_2_2
#Il cambio nome da 'data_2_1' a 'data_2_2' si è fatto solo ed esclusivamente per evitare sovrascrizioni che avrebbero potuto causare problemi in caso di riesecuzione dei comandi precedenti
#Grafico che mostra la capacity di ogni forma di energia contenuta in data_2_2
height = 15
width= 8
fig, ax = plt.subplots(figsize=(height,width))
sns.set_style(style = "white")
sns.set_color_codes("bright")
ax = sns.barplot(x="capacity", y="technology", data= data_2_2, color="r", ax = ax)
# Si crea un DataFrame (data_3) contenente i paesi europei con la relativa capacity per technology
data_3 = data_energy[['technology', 'country_name','capacity']]
data_3 = data_3[~data_3.technology.str.contains('Total')]
data_3
#Vengono rimosse le righe contenente Total all'interno delle technology.
#Questa funzione permette di raggruppare secondo le colonne indicate e poi sommare tutti i valori. Così facendo otteniamo la capacità massima per technology di ogni country.
data_3_1 = data_3.groupby(['country_name', 'technology']).sum()
#Export del DataFrame data_3_1
data_3_1.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_3_1.csv')
#Import DataFrame data_3_1
data_3_2 = pd.read_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_3_1.csv')
data_3_2
#Viene creato il FacetGrid per ogni 'country_name' indicando la capacity di ogni technology
#Si importa 'technology_list' dal file 'technology.py' (L'ordine delle technology è dato da technology_list)
from technology import technology_list
x = sns.FacetGrid(data_3_2, row = 'country_name', height = 6, aspect = 3)
x = x.map(sns.barplot, 'capacity', 'technology', order = technology_list, color = 'r')
x = x.set_axis_labels("", "")
#Per ogni country viene estratta la technology con la capacity massima.
data_3_3 = data_3_2.groupby('country_name').apply(lambda x: x.loc[x.capacity == x.capacity.max(),['technology','capacity']])
data_3_3
#Export del DataFrame data_3_3
data_3_3.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_3_3.csv')
#Si calcola la capacity totale di ogni paese indistintamente dalla technology.
data_4 = data_3_2.groupby(['country_name']).sum()
data_4_1 = data_4.rename(columns = {'capacity': 'capacity_tot_country'})
#Export del DataFrame data_4_1
data_4_1.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_4_1.csv')
#Import DataFrame data_4_1
data_4_2 = pd.read_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_4_1.csv')
data_4_2
#Grafico che mette in relazione le capacity_tot_country
height = 20
width= 10
fig, ax = plt.subplots(figsize=(height,width))
sns.set_style(style = "white")
sns.set_color_codes("pastel")
ax = sns.barplot(x="capacity_tot_country", y="country_name", data= data_4_2, color="r", ax = ax)

#Si crea un filtro per selezionare tutte le forme di energia rinnovabile per poi sommarle e ottenere un'unica variabile che ne indichi la capacity
#Per far ciò si potrebbe sfruttare il fatto che tutte le energie rinnovabili hanno valore True nella colonna energy_source_level_3. Tuttavia useremo str.contains per ottenere solo le righe che hanno Renewable al loro interno.
data_5 = data_3_2[data_3_2.technology.str.contains('renewable') | data_3_2.technology.str.contains('Renewable') ]
#Ovviamente tutte le energie NON rinnovabili vengono filtrate e inserite nel DataFrame, quindi con il prossimo comando le si rimuovono.
data_5_1 = data_5[~data_5.technology.str.contains('Non')]
#Si rimuovono tutti i valori con capacity < 1
data_5_2 = data_5_1.loc[data_5_1 ['capacity'] > 0]
data_5_2
#Grafico che mostra tute le energie rinnovabili per paese
#Si importa 'technology_list_renewable' dal file 'technology_renable.py'
from technology_renewable import technology_list_renewable
x = sns.FacetGrid(data_5_2, row = 'country_name', height = 6, aspect = 3)
x = x.map(sns.barplot, 'capacity', 'technology', order = technology_list_renewable, color = 'black')
x = x.set_axis_labels("", "")
#Si calcola il valore delle country_renewable_tot per ogni paese
data_5_3 = data_5_2.groupby(['country_name']).sum()
data_5_3 = data_5_3.rename(columns = {'capacity': 'country_renewable_tot'})
data_5_3 = data_5_3.reset_index()
data_5_3
#Si crea un nuovo dataframe contenente come colonne 'country_renewable_tot' (data_5_3) e 'capacity_tot_country' (data_4_2).
data_6 = pd.merge(left = data_5_3, right = data_4_2, on = 'country_name')
data_6
data_6['percent_renewable_energy'] = (data_6['country_renewable_tot']/data_6['capacity_tot_country'])*100
data_6
#Export del DataFrame data_6
data_6.to_csv(r'C:\Users\Marco Lombardini\Desktop\ComputerSociety\MaterialeEsercizi\data_6.csv')
height = 20
width= 10
fig, ax = plt.subplots(figsize=(height,width))
sns.set_style(style = "white")
ax = sns.barplot(x="percent_renewable_energy", y="country_name", data= data_6, color="violet", ax = ax)

#Si crea la variabile ('capacity_tot') data dalla somma delle capacity_tot_country.
capacity_tot = data_4_2['capacity_tot_country'].sum()
#Si crea la variabile ('renewable_tot') data dalla somma delle country_renewable_tot.
renewable_tot = data_6['country_renewable_tot'].sum()
#Si calcola la % di energia totale rinnovabile sul territorio europeo.
percent_renewable_tot = (renewable_tot/ capacity_tot)*100
#Si mostra il valore delle variabili appena calcolate.
print('Il valore capacity_tot è:\n',capacity_tot)
print('Il valore renewable_tot è:\n',renewable_tot)
print('Il valore % di energia totale rinnovabile sul territorio europeo è:\n', percent_renewable_tot)
#Si crea un nuovo DataFrame da utilizzare nel Bar Plot che mostra solo 'capacity_tot_country' e 'renewable_tot'
list = [pd.Series(['capacity_tot_country', 97962785.02567886]),
pd.Series(['renewable_tot', 18158532.21450893])]
two_value = pd.DataFrame()
two_value_1 = two_value.append(list)
two_value_1.columns = ['type_total', 'capacity']
two_value_1
#Si procede con la realizzazione del Bar Plot.
height = 10
width= 13
fig, ax = plt.subplots(figsize=(height,width))
sns.set_style(style = 'white')
sns.set_color_codes("pastel")
sns.barplot(x='type_total', y='capacity', data= two_value_1, palette = 'pastel', ax = ax)
#Il primo ciclo if-else svolge una funzione di controllo sul numero inserito dall'utente: se il numero risulta essere errato apparirà un messaggio di errore.
#Il secondo ciclo if-else svolge la funzione vera e propria, reindirizzando l'utente verso il sito desiderato.
#Eseguire il numero inserito con Invio o Shift-Invio (non eseguire con il tasto Run).
import webbrowser
n = int(input('Inserire il numero:'))
if (n == 1) | (n == 2):
print('Il numero inserito è corretto, attendere di essere reindirizzati al sito:')
if (n == 1):
webbrowser.open('//www.datawrapper.de/_/gtj2x/')
else:
webbrowser.open('//www.datawrapper.de/_/Sy3QR/')
else:
print('Il numero inserito non è corretto, riprovare.')